home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 45975 / 45975.xpi / modules / cnldao.js next >
Text File  |  2009-11-22  |  4KB  |  99 lines

  1. /*
  2.  * Copyright (c) 2009 Bui Viet Thanh (thanhbv@gmail.com).
  3.  *
  4.  * This file is part of clicknlearn.
  5.  *
  6.  * clicknlearn is free software: you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation, either version 3 of the License, or
  9.  * (at your option) any later version.
  10.  *
  11.  * clicknlearn is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with clicknlearn.  If not, see <http://www.gnu.org/licenses/>.
  18.  */
  19.  
  20. const EXPORTED_SYMBOLS = ['CNL_DAO'];
  21.  
  22. /**
  23.  * Clicknlearn Data Access Object singleton.
  24.  *
  25.  * see: http://blog.anselmbradford.com/2009/04/21/object-oriented-javascript-tip-the-quintessential-singleton/
  26.  * or http://kaijaeger.com/articles/the-singleton-design-pattern-in-javascript.html
  27.  *
  28.  * created and instantiated the class in one statemen:
  29.  */
  30. var CNL_DAO = new function(){
  31.     /**
  32.      * see: sqlite (storage in firefox) - https://developer.mozilla.org/en/Storage
  33.      * & https://developer.mozilla.org/en/Code_snippets/File_I%2F%2FO
  34.      */
  35. // initialize:
  36.     // ~/.mozilla/firefox/${profile}
  37.     // ex: /home/thanhbv/.mozilla/firefox/08mo3aw2.dev
  38.     var file = Components.classes["@mozilla.org/file/directory_service;1"]
  39.             .getService(Components.interfaces.nsIProperties)
  40.             .get("ProfD", Components.interfaces.nsIFile);
  41.     file.append("vocabulary.sqlite");
  42.     var dbHasBeenInit = file.exists();
  43.     var storageService = Components.classes["@mozilla.org/storage/service;1"]
  44.             .getService(Components.interfaces.mozIStorageService);
  45.     this.dbConn = storageService.openDatabase(file); // Will also create the file if it does not exist
  46.     if(! dbHasBeenInit)
  47.         this.dbConn.executeSimpleSQL(
  48.                 "CREATE TABLE vocabulary (word VARCHAR PRIMARY KEY NOT NULL, originalUrl VARCHAR, " +
  49.                 "remind VARCHAR, read INTEGER NOT NULL DEFAULT 0)");//, lastModify DATETIME DEFAULT CURRENT_TIMESTAMP)");
  50.     /**
  51.      * @param record CNLRec instance. Note: word is store in record.id
  52.      * TODO sql injection
  53.      */
  54.     this.create = function(record){
  55.         var sql = "INSERT OR REPLACE INTO vocabulary (word, originalUrl, remind, read) VALUES ('"
  56.                 + record.id + "', '" + record.originalUrl + "', '"
  57.                 + record.remind + "', '" + record.read + "')";
  58.         this.dbConn.executeSimpleSQL(sql);
  59.     }
  60.  
  61.     this.update = function(record) {
  62.         // look up the stored record with id = record.id, then set
  63.         // its values to those of new record
  64.         let sql = "UPDATE vocabulary SET originalUrl = :url, remind = :remind, read = :read" +
  65. //                  ", lastModify = CURRENT_TIMESTAMP " +
  66.                   "WHERE word = :word";
  67.         let stm = this.dbConn.createStatement(sql);
  68.         stm.params.url = record.originalUrl;
  69.         stm.params.remind = record.remind;
  70.         stm.params.read = record.read;
  71.         stm.params.word = record.id;
  72.         stm.execute();
  73.     }
  74.  
  75.     this.remove = function(word) {
  76.         // look up the stored record with id = record.id, then delete it.
  77.         this.dbConn.executeSimpleSQL("DELETE FROM vocabulary WHERE word = '" + word + "'");
  78.     }
  79.  
  80.     this.setWordRead = function(word){
  81.         this.dbConn.executeSimpleSQL("UPDATE vocabulary SET read = 1 WHERE word = '" + word + "'");
  82.     }
  83.  
  84.     this.getWordData = function(word){
  85.         var statement = this.dbConn.createStatement(
  86.                 'SELECT remind, originalUrl, read FROM vocabulary WHERE word = :word');
  87.         statement.params.word = word;
  88.         if(statement.executeStep()){
  89.             return statement.row;
  90.         }
  91.         else
  92.             return null;
  93.     }
  94.  
  95.     this.selectUnreadWordsStm = function(){
  96.         return this.dbConn.createStatement("SELECT word FROM vocabulary WHERE read = 0");
  97.     }
  98. }
  99.